import PaletteProvider from 'bpmn-js/lib/features/palette/PaletteProvider';
import { assign } from '@/components/bpmnModel/utils/min-dash.js';

export default function CustomPalette(
    palette,
    create,
    elementFactory,
    spaceTool,
    lassoTool,
    handTool,
    globalConnect,
    translate
) {
    PaletteProvider.call(
        this,
        palette,
        create,
        elementFactory,
        spaceTool,
        lassoTool,
        handTool,
        globalConnect,
        translate,
        2000
    );
}

const F = function () {}; // 核心，利用空对象作为中介；
F.prototype = PaletteProvider.prototype; // 核心，将父类的原型赋值给空对象F；

// 利用中介函数重写原型链方法
F.prototype.getPaletteEntries = function () {
    var actions = {};
    var create = this._create;
    var elementFactory = this._elementFactory;
    var spaceTool = this._spaceTool;
    var lassoTool = this._lassoTool;
    var handTool = this._handTool;
    var globalConnect = this._globalConnect;
    var translate = this._translate;

    function createAction(type, group, className, title, options) {
        function createListener(event) {
            var shape = elementFactory.createShape(assign({ type: type }, options));

            if (options) {
                shape.businessObject.di.isExpanded = options.isExpanded;
            }

            create.start(event, shape);
        }

        var shortType = type.replace(/^bpmn:/, '');

        return {
            group: group,
            className: className,
            title: title || translate('Create {type}', { type: shortType }),
            action: {
                dragstart: createListener,
                click: createListener
            }
        };
    }

    function createSubprocess(event) {
        var subProcess = elementFactory.createShape({
            type: 'bpmn:SubProcess',
            x: 0,
            y: 0,
            isExpanded: true
        });

        var startEvent = elementFactory.createShape({
            type: 'bpmn:StartEvent',
            x: 40,
            y: 82,
            parent: subProcess
        });

        create.start(event, [subProcess, startEvent], {
            hints: {
                autoSelect: [startEvent]
            }
        });
    }

    function createParticipant(event) {
        create.start(event, elementFactory.createParticipantShape());
    }

    assign(actions, {
        'hand-tool': {
            group: 'tools',
            className: 'bpmn-icon-hand-tool',
            title: translate('Activate the hand tool'),
            action: {
                click: function (event) {
                    handTool.activateHand(event);
                }
            }
        },
        'lasso-tool': {
            group: 'tools',
            className: 'bpmn-icon-lasso-tool',
            title: translate('Activate the lasso tool'),
            action: {
                click: function (event) {
                    lassoTool.activateSelection(event);
                }
            }
        },
        'space-tool': {
            group: 'tools',
            className: 'bpmn-icon-space-tool',
            title: translate('Activate the create/remove space tool'),
            action: {
                click: function (event) {
                    spaceTool.activateSelection(event);
                }
            }
        },
        'global-connect-tool': {
            group: 'tools',
            className: 'bpmn-icon-connection-multi',
            title: translate('Activate the global connect tool'),
            action: {
                click: function (event) {
                    globalConnect.toggle(event);
                }
            }
        },
        'tool-separator': {
            group: 'tools',
            separator: true
        },
        'create.start-event': createAction(
            'bpmn:StartEvent',
            'event',
            'bpmn-icon-start-event-none',
            translate('Create StartEvent')
        ),
        // 'create.intermediate-event': createAction(
        //   'bpmn:IntermediateThrowEvent',
        //   'event',
        //   'bpmn-icon-intermediate-event-none',
        //   translate('Create Intermediate/Boundary Event')
        // ),
        'create.end-event': createAction(
            'bpmn:EndEvent',
            'event',
            'bpmn-icon-end-event-none',
            translate('Create EndEvent')
        ),

        //'create.exclusive-gateway': createAction('bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-none', translate('Create Gateway')),//Y9--

        // 'create.exclusive-gateway': createAction(
        //     'bpmn:ExclusiveGateway',
        //     'gateway',
        //     'bpmn-icon-gateway-xor',
        //     translate('Create Exclusive Gateway')
        // ), //Y9++

        'create.parallel-gateway': createAction(
            'bpmn:ParallelGateway',
            'gateway',
            'bpmn-icon-gateway-parallel',
            translate('Create Parallel Gateway')
        ), //Y9++

        'create.inclusive-gateway': createAction(
            'bpmn:InclusiveGateway',
            'gateway',
            'bpmn-icon-gateway-or',
            translate('Create Inclusive Gateway')
        ),

        'create.complex-gateway': createAction(
            'bpmn:ComplexGateway',
            'gateway',
            'bpmn-icon-gateway-complex',
            translate('Create Complex Gateway')
        ),

        // 'create.eventBased-gateway': createAction(
        //     'bpmn:EventBasedGateway',
        //     'gateway',
        //     'bpmn-icon-gateway-eventbased',
        //     translate('Create Event based Gateway')
        // ), //Y9++

        'create.user-task': createAction(
            'bpmn:UserTask',
            'activity',
            'bpmn-icon-user-task',
            translate('Create User Task')
        )
        // 'create.data-object': createAction('bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object', translate('Create DataObjectReference')),
        // 'create.data-store': createAction('bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store', translate('Create DataStoreReference')),
        // 'create.subprocess-expanded': {//子流程
        //   group: 'activity',
        //   className: 'bpmn-icon-subprocess-expanded',
        //   title: translate('Create expanded SubProcess'),
        //   action: {
        //     dragstart: createSubprocess,
        //     click: createSubprocess
        //   }
        // },
        // 'create.participant-expanded': {
        //   group: 'collaboration',
        //   className: 'bpmn-icon-participant',
        //   title: translate('Create Pool/Participant'),
        //   action: {
        //     dragstart: createParticipant,
        //     click: createParticipant
        //   }
        // },
        // 'create.group': createAction('bpmn:Group', 'artifact', 'bpmn-icon-group', translate('Create Group'))
    });

    return actions;
};

CustomPalette.$inject = [
    'palette',
    'create',
    'elementFactory',
    'spaceTool',
    'lassoTool',
    'handTool',
    'globalConnect',
    'translate'
];

CustomPalette.prototype = new F(); // 核心，将 F的实例赋值给子类；
CustomPalette.prototype.constructor = CustomPalette; // 修复子类CustomPalette的构造器指向，防止原型链的混乱；
